"""
带外管理工具类
提供带外管理相关的工具函数
"""

import logging
import re
import uuid
from typing import Dict, Any, List, Optional
from urllib.parse import urlparse

logger = logging.getLogger(__name__)

class OobUtils:
    """带外管理工具类"""
    
    def __init__(self):
        self.logger = logger
    
    def generate_oob_id(self) -> str:
        """
        生成带外管理ID
        
        Returns:
            带外管理ID
        """
        return f"OOB-{uuid.uuid4().hex[:8].upper()}"
    
    def validate_oob_data(self, oob_data: Dict[str, Any]) -> tuple[bool, str]:
        """
        验证带外管理数据
        
        Args:
            oob_data: 带外管理数据
            
        Returns:
            (是否有效, 错误信息)
        """
        # 检查必填字段
        required_fields = ['asset_id', 'login_url']
        for field in required_fields:
            if not oob_data.get(field):
                return False, f"字段 {field} 不能为空"
        
        # 验证登录URL格式
        if not self._is_valid_url(oob_data['login_url']):
            return False, "登录URL格式不正确"
        
        return True, ""
    
    def format_oob_data(self, oob_data: Dict[str, Any]) -> Dict[str, Any]:
        """
        格式化带外管理数据
        
        Args:
            oob_data: 原始数据
            
        Returns:
            格式化后的数据
        """
        formatted_data = oob_data.copy()
        
        # 生成ID（如果不存在）
        if not formatted_data.get('oob_id'):
            formatted_data['oob_id'] = self.generate_oob_id()
        
        # 清理URL
        if formatted_data.get('login_url'):
            formatted_data['login_url'] = formatted_data['login_url'].strip()
        
        return formatted_data
    
    def _is_valid_url(self, url: str) -> bool:
        """
        验证URL格式
        
        Args:
            url: URL字符串
            
        Returns:
            是否有效
        """
        try:
            result = urlparse(url)
            return all([result.scheme, result.netloc])
        except Exception:
            return False
    
    def get_oob_type_from_url(self, url: str) -> str:
        """
        根据URL判断带外管理类型
        
        Args:
            url: 登录URL
            
        Returns:
            带外管理类型
        """
        url_lower = url.lower()
        
        if 'idrac' in url_lower:
            return 'iDRAC'
        elif 'ilo' in url_lower:
            return 'iLO'
        elif 'imm' in url_lower:
            return 'IMM'
        elif 'ipmi' in url_lower:
            return 'IPMI'
        elif 'kvm' in url_lower:
            return 'KVM'
        else:
            return '未知类型'
    
    def format_oob_info(self, oob_data: Dict[str, Any]) -> str:
        """
        格式化带外管理信息显示
        
        Args:
            oob_data: 带外管理数据
            
        Returns:
            格式化的信息字符串
        """
        info_lines = []
        
        info_lines.append(f"带外管理ID: {oob_data.get('oob_id', 'N/A')}")
        info_lines.append(f"设备资产ID: {oob_data.get('asset_id', 'N/A')}")
        info_lines.append(f"登录URL: {oob_data.get('login_url', 'N/A')}")
        
        # 判断带外管理类型
        if oob_data.get('login_url'):
            oob_type = self.get_oob_type_from_url(oob_data['login_url'])
            info_lines.append(f"带外类型: {oob_type}")
        
        if oob_data.get('create_time'):
            info_lines.append(f"创建时间: {oob_data['create_time']}")
        
        if oob_data.get('update_time'):
            info_lines.append(f"更新时间: {oob_data['update_time']}")
        
        return '\n'.join(info_lines)
    
    def get_filter_options(self) -> Dict[str, List[str]]:
        """
        获取筛选选项
        
        Returns:
            筛选选项字典
        """
        return {
            'oob_type': ['iDRAC', 'iLO', 'IMM', 'IPMI', 'KVM', '未知类型'],
            'status': ['正常', '异常', '维护中']
        }
    
    def filter_oob_data(self, oob_list: List[Dict[str, Any]], 
                       filter_type: str, filter_value: str) -> List[Dict[str, Any]]:
        """
        筛选带外管理数据
        
        Args:
            oob_list: 带外管理列表
            filter_type: 筛选类型
            filter_value: 筛选值
            
        Returns:
            筛选后的列表
        """
        if not filter_value or filter_value == "全部":
            return oob_list
        
        filtered_list = []
        
        for oob in oob_list:
            if filter_type == "oob_type":
                oob_type = self.get_oob_type_from_url(oob.get('login_url', ''))
                if oob_type == filter_value:
                    filtered_list.append(oob)
            elif filter_type == "asset_id":
                if filter_value.lower() in oob.get('asset_id', '').lower():
                    filtered_list.append(oob)
            elif filter_type == "login_url":
                if filter_value.lower() in oob.get('login_url', '').lower():
                    filtered_list.append(oob)
        
        return filtered_list
    
    def search_oob_data(self, oob_list: List[Dict[str, Any]], search_text: str) -> List[Dict[str, Any]]:
        """
        搜索带外管理数据
        
        Args:
            oob_list: 带外管理列表
            search_text: 搜索文本
            
        Returns:
            搜索结果列表
        """
        if not search_text:
            return oob_list
        
        search_text = search_text.lower()
        search_results = []
        
        for oob in oob_list:
            # 搜索多个字段
            searchable_fields = [
                oob.get('oob_id', ''),
                oob.get('asset_id', ''),
                oob.get('login_url', ''),
                self.get_oob_type_from_url(oob.get('login_url', ''))
            ]
            
            # 如果任何字段包含搜索文本，则添加到结果
            if any(search_text in field.lower() for field in searchable_fields):
                search_results.append(oob)
        
        return search_results